import { useQueryClient } from '@tanstack/react-query'
import { useParams } from 'common'
import dayjs from 'dayjs'
import { ArrowRight, RefreshCw } from 'lucide-react'
import { useEffect, useMemo, useRef, useState } from 'react'
import ReportFilterBar from '@/components/interfaces/Reports/ReportFilterBar'
import ReportHeader from '@/components/interfaces/Reports/ReportHeader'
import ReportPadding from '@/components/interfaces/Reports/ReportPadding'
import { REPORT_DATERANGE_HELPER_LABELS } from '@/components/interfaces/Reports/Reports.constants'
import ReportStickyNav from '@/components/interfaces/Reports/ReportStickyNav'
import { SharedAPIReport } from '@/components/interfaces/Reports/SharedAPIReport/SharedAPIReport'
import { useSharedAPIReport } from '@/components/interfaces/Reports/SharedAPIReport/SharedAPIReport.constants'
import { ReportChartV2 } from '@/components/interfaces/Reports/v2/ReportChartV2'
import { LogsDatePicker } from '@/components/interfaces/Settings/Logs/Logs.DatePickers'
import UpgradePrompt from '@/components/interfaces/Settings/Logs/UpgradePrompt'
import DefaultLayout from '@/components/layouts/DefaultLayout'
import ObservabilityLayout from '@/components/layouts/ObservabilityLayout/ObservabilityLayout'
import { ButtonTooltip } from '@/components/ui/ButtonTooltip'
import { ObservabilityLink } from '@/components/ui/ObservabilityLink'
import { realtimeReports } from '@/data/reports/v2/realtime.config'
import { useRefreshHandler, useReportDateRange } from '@/hooks/misc/useReportDateRange'
import { useDatabaseSelectorStateSnapshot } from '@/state/database-selector'
import type { NextPageWithLayout } from '@/types'
const RealtimeReport: NextPageWithLayout = () => {
return (
)
}
RealtimeReport.getLayout = (page) => (
{page}
)
export type UpdateDateRange = (from: string, to: string) => void
export default RealtimeReport
const RealtimeUsage = () => {
const [isRefreshing, setIsRefreshing] = useState(false)
const { db, chart, ref } = useParams()
const {
selectedDateRange,
updateDateRange: updateDateRangeFromHook,
datePickerValue,
datePickerHelpers,
showUpgradePrompt,
setShowUpgradePrompt,
handleDatePickerChange,
} = useReportDateRange(REPORT_DATERANGE_HELPER_LABELS.LAST_60_MINUTES)
const queryClient = useQueryClient()
const {
data,
error,
isLoading,
refetch,
isRefetching,
filters,
addFilter,
removeFilters,
isLoadingData,
sql,
} = useSharedAPIReport({
filterBy: 'realtime',
start: selectedDateRange?.period_start?.date,
end: selectedDateRange?.period_end?.date,
})
const chartSyncId = `realtime-${ref}`
const state = useDatabaseSelectorStateSnapshot()
const reportConfig = useMemo(() => {
return realtimeReports({
projectRef: ref!,
startDate: selectedDateRange?.period_start?.date ?? '',
endDate: selectedDateRange?.period_end?.date ?? '',
interval: selectedDateRange?.interval ?? 'minute',
databaseIdentifier: state.selectedDatabaseId,
})
}, [ref, selectedDateRange, state.selectedDatabaseId])
const onRefreshReport = useRefreshHandler(
datePickerValue,
datePickerHelpers,
handleDatePickerChange,
async () => {
if (!selectedDateRange) return
setIsRefreshing(true)
queryClient.invalidateQueries({
queryKey: ['projects', ref, 'report-v2', { queryGroup: 'realtime' }],
})
refetch()
setTimeout(() => setIsRefreshing(false), 1000)
}
)
const urlStateHasSyncedRef = useRef(false)
useEffect(() => {
if (urlStateHasSyncedRef.current) return
urlStateHasSyncedRef.current = true
if (db !== undefined) {
setTimeout(() => {
// [Joshen] Adding a timeout here to support navigation from settings to reports
// Both are rendering different instances of ProjectLayout which is where the
// DatabaseSelectorContextProvider lies in (unless we reckon shifting the provider up one more level is better)
state.setSelectedDatabaseId(db)
}, 100)
}
if (chart !== undefined) {
setTimeout(() => {
const el = document.getElementById(chart)
if (el) el.scrollIntoView({ behavior: 'smooth', block: 'center' })
}, 200)
}
}, [db, chart, state])
const updateDateRange: UpdateDateRange = (from: string, to: string) => {
updateDateRangeFromHook(from, to)
}
return (
<>
}
className="w-7"
tooltip={{ content: { side: 'bottom', text: 'Refresh report' } }}
onClick={onRefreshReport}
/>
{selectedDateRange && (
{dayjs(selectedDateRange.period_start.date).format('MMM D, h:mma')}
{dayjs(selectedDateRange.period_end.date).format('MMM D, h:mma')}
)}
}
>
{selectedDateRange &&
reportConfig
.filter((report) => !report.hide)
.map((report) => (
))}
>
)
}